package shuaige.jdk.集合.有序列表的集合List;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayToList转换2();
    }

    public static void 创建List() {
        List<Integer> list = List.of(1, 2, 5);
    }

    public static void 遍历List() {
        List<String> list = List.of("apple", "pear", "banana");
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }
    }

    public static void 迭代器() {
        List<String> list = List.of("apple", "pear", "banana");
        for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
            String s = it.next();
            System.out.println(s);
        }
    }

    /**
     * Java编译器本身并不知道如何遍历集合对象，
     * 但它会自动把for each循环变成Iterator的调用，
     * 原因就在于Iterable接口定义了一个Iterator<E> iterator()方法，强迫集合类必须返回一个Iterator实例。
     */
    public static void foreach() {
        List<String> list = List.of("apple", "pear", "banana");
        for (String s : list) {
            System.out.println(s);
        }
    }

    /**
     * 这种方法会丢失类型信息，所以实际应用很少。
     */
    public static void ListToArray转换1() {
        List<String> list = List.of("apple", "pear", "banana");
        Object[] array = list.toArray();
        for (Object s : array) {
            System.out.println(s);
        }
    }

    /**
     * 第二种方式是给toArray(T[])传入一个类型相同的Array，List内部自动把元素复制到传入的Array中：
     */
    public static void ListToArray转换2() {
        List<Integer> list = List.of(12, 34, 56);
        Integer[] array = list.toArray(new Integer[3]);
        for (Integer n : array) {
            System.out.println(n);
        }
    }

    /**
     * 注意到这个toArray(T[])方法的泛型参数<T>并不是List接口定义的泛型参数<E>，
     * 所以，我们实际上可以传入其他类型的数组，例如我们传入Number类型的数组，返回的仍然是Number类型：
     */
    public static void ListToArray转换3() {
        List<Integer> list = List.of(12, 34, 56);
        Number[] array = list.toArray(new Number[3]);
        for (Number n : array) {
            System.out.println(n);
        }
    }

    public static void ArrayToList转换1() {
        Integer[] array = {1, 2, 3};
        List<Integer> list = List.of(array);
    }

    /**
     * 对只读List调用add()、remove()方法会抛出UnsupportedOperationException。
     */
    public static void ArrayToList转换2() {
        List<Integer> list = List.of(12, 34, 56);
        list.add(999); // UnsupportedOperationException
    }

    /**
     * 正常使用
     */
    public static void ArrayToList转换3() {
        List<Integer> list = new ArrayList<>(List.of(12, 34, 56));
        list.add(999);
    }

}
